package com.ruogu.codegeneration.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.ruogu.codegeneration.model.dto.app.AppQueryRequest;
import com.ruogu.codegeneration.model.entity.App;
import com.ruogu.codegeneration.model.entity.User;
import com.ruogu.codegeneration.model.vo.app.AppVO;
import jakarta.servlet.http.HttpServletRequest;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用服务层
 *
 * @author ruogu
 */
public interface AppService extends IService<App> {

    /**
     * 校验应用参数
     *
     * @param app 应用实体
     * @param add 是否为创建校验
     */
    void validApp(App app, boolean add);

    /**
     * 将App对象转换为AppVO对象
     *
     * @param app 应用实体对象，包含应用的所有信息
     * @return AppVO 应用返回对象，用于向前端展示应用信息
     */
    AppVO getAppVO(App app);

    /**
     * 将应用实体列表转换为应用VO列表
     *
     * @param appList 应用实体列表
     * @return 应用VO列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 获取查询条件 QueryWrapper
     *
     * @param appQueryRequest 应用查询请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 检查用户是否有权限操作应用
     *
     * @param app 应用实体
     * @param request HTTP请求
     * @return true 有权限，false 无权限
     */
    boolean checkAppPermission(App app, HttpServletRequest request);

    /**
     *  聊天生成代码
     * @param appId 应用id
     * @param message 消息
     * @param loginUser 登录用户
     * @return 生成的代码流式
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser);

    /**
     * 应用部署
     * @param appId 应用id
     * @param loginUser 登录用户
     * @return 部署结果
     */
    String deployApp(Long appId, User loginUser);

    /**
     * 异步生成应用截图
     * @param appId 应用id
     * @param appUrl 应用url
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);
}
